package org.springboot.demo.converter;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;

public class MappingFastJsonHttpMessageConverter extends AbstractHttpMessageConverter<Object> {
	public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");  
    
    // fastjson特性参数  
    private SerializerFeature[] serializerFeature;  

    public SerializerFeature[] getSerializerFeature() {  
        return serializerFeature;  
    }  

    public void setSerializerFeature(SerializerFeature[] serializerFeature) {  
        this.serializerFeature = serializerFeature;  
    }
    public MappingFastJsonHttpMessageConverter() {  
        super(new MediaType("application", "json", DEFAULT_CHARSET));  
    }

	@Override
	protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage)
			throws IOException, HttpMessageNotReadableException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        int i;  
        while ((i = inputMessage.getBody().read()) != -1) {  
            baos.write(i);  
        }  
        return JSON.parseArray(baos.toString(), clazz); 
	}

	@Override
	protected boolean supports(Class<?> arg0) {
		// TODO Auto-generated method stub
		return true;
	}

	@Override
	protected void writeInternal(Object o, HttpOutputMessage outputMessage)
			throws IOException, HttpMessageNotWritableException {
		String jsonString = JSON.toJSONString(o, serializerFeature);
        OutputStream out = outputMessage.getBody();
        out.write(jsonString.getBytes(DEFAULT_CHARSET));
        out.flush();
		
	}

}
